package webservice;

import java.awt.PageAttributes.MediaType;
import java.util.ArrayList;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

import logica.Fachada;
import logica.VO.VOCheckStatus;
import logica.VO.VOListarPartidas;
import logica.VO.VOMensaje;
import logica.VO.VOPartida;
import logica.VO.VORefresh;
import model.AccessManager;

import com.google.gson.Gson;

import entities.Jugador;

@Path("/webservice")
public class webservice {
	@GET
	@Path("/jugadores")
	@Produces("application/xml")
	public ArrayList<Jugador> getJugadores()
	{
		String jugadores = null;
		ArrayList<Jugador> listaJugadores = new ArrayList<Jugador>();
		try
		{
			listaJugadores = new AccessManager().getJugadores();
		} catch (Exception e)
		{
				e.printStackTrace();
		}
		return listaJugadores;
	}
	
	//Esto es solo para probar cargar la ultima posicion sin verificar que jugador es
	@GET
	@Path("/ultimaposicion")
	@Produces("application/xml")
	@Consumes("application/xml")
	public Jugador getUltimaposicion()
	{
		String jugadores = null;
		Jugador j = new Jugador();
		try
		{
			j = new AccessManager().getUltimaposicion();
		} catch (Exception e)
		{
				e.printStackTrace();
		}
		return j;
	}
	
	
	@GET
	@Path("/agregarjugador/{coordX}/{coordY}")	
	@Consumes("application/xml")
	public String agregarJugador(@PathParam("coordX") float pCoordX, @PathParam("coordY") float pCoordY)
	{
		boolean lReturn = false;
		try
		{
			AccessManager manager = new AccessManager();
			lReturn = manager.agregarJugador(pCoordX, pCoordY);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
		}		
		
		if(lReturn)
			return "<Status>" + "ok" + "</Status>";
		else
			return "<Status>" + "not ok" + "</Status>";
			
	}
	
	@GET
	@Path("/updatePos/{id}/{coordX}/{coordY}")	
	@Consumes("application/xml")
	public String updatePos(@PathParam("id") int id, @PathParam("coordX") float pCoordX, @PathParam("coordY") float pCoordY)
	{
		boolean lReturn = false;
		try
		{
			AccessManager manager = new AccessManager();
			lReturn = manager.updatePos(id, pCoordX, pCoordY);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
		}		
		
		if(lReturn)
			return "<Status>" + "ok" + "</Status>";
		else
			return "<Status>" + "not ok" + "</Status>";
			
	}
	
	@GET
	@Path("/getEnemy/{id}")	
	@Consumes("application/xml")
	public Jugador getEnemy(@PathParam("id") int id)
	{
		Jugador j = null;
		try
		{
			AccessManager manager = new AccessManager();
			j = manager.getEnemy(id);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
		}		
		
		return j;
			
	}
	
	//METODOS OFICIALES
		
	@GET
	@Path("/nuevaPartida/{nombrePartida}")	
	@Consumes("application/xml")
	public VOPartida nuevaPartida(@PathParam("nombrePartida") String nomPar)
	{
		VOPartida nuevaPartida = new VOPartida();
		try
		{
			Fachada facade = Fachada.getInstancia();
			nuevaPartida = facade.nuevaPartida(nomPar);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				nuevaPartida.setHayError(true);
				nuevaPartida.setMsjError(e.getMessage());
		}
		
		return nuevaPartida;
			
	}
	
	@GET
	@Path("/unirsePartida/")	
	@Consumes("application/xml")
	public VOPartida unirsePartida()
	{
		VOPartida partidaActual = new VOPartida();
		try
		{
			Fachada facade = Fachada.getInstancia();
			partidaActual = facade.unirsePartida();			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				partidaActual.setHayError(true);
				partidaActual.setMsjError(e.getMessage());
		}
		
		return partidaActual;
			
	}
	

	@GET
	@Path("/refresh/{idJugador}/{idPersonaje}/{x}/{y}/{hayDisparo}/{direccion}")	
	@Consumes("application/xml")
	public VORefresh refresh(@PathParam("idJugador") int idJugador, @PathParam("idPersonaje") int idPersonaje, @PathParam("x") float x, @PathParam("y") float y, @PathParam("hayDisparo") boolean hayDisparo, @PathParam("direccion") String direccion)
	{
		VORefresh refresh = new VORefresh();
		try
		{
			Fachada facade = Fachada.getInstancia();
			refresh = facade.refresh(idJugador, idPersonaje,  x,  y, hayDisparo, direccion);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				refresh.setHayError(true);
				refresh.setMsjError(e.getMessage());
		}
		
		return refresh;
			
	}
	
	@GET
	@Path("/pausa/{pausa}")	
	@Consumes("application/xml")
	public VOMensaje pausa(@PathParam("pausa") boolean pausa)
	{
		VOMensaje mensaje = new VOMensaje();
		try
		{
			Fachada facade = Fachada.getInstancia();
			mensaje = facade.pausa(pausa);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				mensaje.setHayError(true);
				mensaje.setMsjError(e.getMessage());
		}
		
		return mensaje;
			
	}
	
	@GET
	@Path("/checkStatus/")	
	@Consumes("application/xml")
	public VOCheckStatus checkStatus()
	{
		VOCheckStatus mensaje = new VOCheckStatus();
		try
		{
			Fachada facade = Fachada.getInstancia();
			mensaje = facade.checkStatus();			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				mensaje.setHayError(true);
				mensaje.setMsjError(e.getMessage());
		}
		
		return mensaje;
			
	}
	
	@GET
	@Path("/impacto/{idJugador}/{idImpactado}/{esPersonaje}/{esAmigo}/{esBomba}")	
	@Consumes("application/xml")
	public VOMensaje impacto(@PathParam("idJugador") int idJugador, @PathParam("idImpactado") int idImpactado, @PathParam("esPersonaje") boolean esPersonaje, @PathParam("esAmigo") boolean esAmigo, @PathParam("esBomba") boolean esBomba)
	{
		VOMensaje mensaje = new VOMensaje();
		try
		{
			Fachada facade = Fachada.getInstancia();
			mensaje = facade.impacto(idJugador, idImpactado, esPersonaje, esAmigo, esBomba);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				mensaje.setHayError(true);
				mensaje.setMsjError(e.getMessage());
		}
		
		return mensaje;
			
	}
	
	@GET
	@Path("/drone/{activado}")	
	@Consumes("application/xml")
	public VOMensaje drone(@PathParam("activado") boolean activado)
	{
		VOMensaje mensaje = new VOMensaje();
		try
		{
			Fachada facade = Fachada.getInstancia();
			mensaje = facade.drone(activado);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				mensaje.setHayError(true);
				mensaje.setMsjError(e.getMessage());
		}
		
		return mensaje;
			
	}
	
	@GET
	@Path("/guardarPartida/")	
	@Consumes("application/xml")
	public VOMensaje guardarPartida()
	{
		VOMensaje mensaje = new VOMensaje();
		try
		{
			Fachada facade = Fachada.getInstancia();
			mensaje = facade.guardarPartida();			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				mensaje.setHayError(true);
				mensaje.setMsjError(e.getMessage());
		}
		
		return mensaje;
			
	}
	
	@GET
	@Path("/cargarPartida/{idPartida}")	
	@Consumes("application/xml")
	public VOPartida cargarPartida(@PathParam("idPartida") int idPartida)
	{
		VOPartida partida = new VOPartida();
		try
		{
			Fachada facade = Fachada.getInstancia();
			partida = facade.cargarPartida(idPartida);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				partida.setHayError(true);
				partida.setMsjError(e.getMessage());
		}
		
		return partida;
			
	}
	
	@GET
	@Path("/listarPartidas/")	
	@Consumes("application/xml")
	public VOListarPartidas listarPartidas()
	{
		VOListarPartidas lista = new VOListarPartidas();
		try
		{
			Fachada facade = Fachada.getInstancia();
			lista = facade.listarPartidas();			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				lista.setHayError(true);
				lista.setMsjError(e.getMessage());
		}
		
		return lista;
			
	}
	
	@GET
	@Path("/terminarPartida/")	
	@Consumes("application/xml")
	public VOMensaje terminarPartida()
	{
		VOMensaje mensaje = new VOMensaje();
		try
		{
			Fachada facade = Fachada.getInstancia();
			mensaje = facade.terminarPartida();			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				mensaje.setHayError(true);
				mensaje.setMsjError(e.getMessage());
		}
		
		return mensaje;
			
	}
	
	@GET
	@Path("/cambioPersonaje/{idJugador}/{idPersonaje}")	
	@Consumes("application/xml")
	public VOPartida cambioPersonaje(@PathParam("idJugador") int idJugador, @PathParam("idPersonaje") int idPersonaje)
	{
		VOPartida partida = new VOPartida();
		try
		{
			Fachada facade = Fachada.getInstancia();
			partida = facade.cambioPersonaje(idJugador, idPersonaje);			

		} 
		catch (Exception e)
		{
				e.printStackTrace();
				partida.setHayError(true);
				partida.setMsjError(e.getMessage());
		}
		
		return partida;
			
	}
	
}
